home *** CD-ROM | disk | FTP | other *** search
- /* effect.c */
-
- #include <stdio.h>
- #include <xsp2lib.h>
- #include "main.h"
- #include "effect.h"
-
-
- #define EFFECT_MAX 32 /* エフェクト最大数 */
- static EFFECT effect[EFFECT_MAX]; /* ワーク */
- static EFFECT *effect_top, /* 使用中のワークのリスト */
- *effect_null_top; /* 空のワークのリスト */
-
-
- /* ザコキャラ爆発 */
- static short EffectMoveExplZako (EFFECT * p)
- {
- if (p->pt++ >= obj_explall + 71 + 29 - 1)
- return (-1);
- else
- xobj_set_st (p);
-
- return (0);
- }
-
-
-
- /* ゲーム開始時に呼ばれる */
- void EffectInit (void)
- {
- int i;
-
- /* リストをつなげる */
- effect_top = NULL;
- effect_null_top = effect;
- for (i = 0; i < EFFECT_MAX; i++)
- effect[i].next = &effect[i + 1];
-
- effect[EFFECT_MAX - 1].next = NULL;
- }
-
-
-
- /* エフェクト出現時に呼ばれる */
- void EffectAlloc (short type, short type2, short x, short y)
- {
- EFFECT *p;
-
- if (effect_null_top == NULL)
- return; /* 空きのワークがない(キャラクターオーバー) */
-
- p = effect_null_top;
- effect_null_top = p->next;
- p->next = effect_top;
- effect_top = p;
-
- p->type = type;
- p->type2 = type2;
- p->x = x;
- p->y = y;
-
- p->pt = obj_explall + 71;
- p->info = 0x0100 | PRIORITY_ZAKO_EXPL;
- p->func_effect_move = EffectMoveExplZako;
- }
-
-
-
- /* 垂直同期ごとに呼ばれる */
- void EffectMove (void)
- {
- EFFECT *p, *q;
-
- p = effect_top; /* 現在注目しているワーク */
- q = NULL; /* 1つ前のワーク(ワーク削除時に必要) */
- while (p != NULL) {
- /* 移動ルーチンへ飛ぶ(関数へのポインタってヤツ) */
- if ((p->func_effect_move) (p)) { /* 返り値が非0なら消去 */
- if (q == NULL) { /* リストの一番最初を削除 */
- effect_top = p->next;
- p->next = effect_null_top;
- effect_null_top = p;
- q = NULL;
- p = effect_top;
- } else {
- q->next = p->next;
- p->next = effect_null_top;
- effect_null_top = p;
- p = q->next;
- }
- } else {
- q = p;
- p = p->next;
- }
- }
- }
-